<?php

namespace Admin\Service;

/**
 * 角色管理页面 model(数据层)
 *
 * @package         YDCMS
 * @author          QQ:644157559 <644157559@qq.com>
 * @version         $Id: RolesService.class.php v1.0 2014-06-13 17:27:03 $
 */
class RolesService extends CommonService {
    
    /**
     * 添加角色
     * @param type $data
     * @return type
     */
    public function addRole($data) {
        $Role = $this->getD();
        if (false === ($role = $Role->create($data))) {
            return $this->errorResultReturn($Role->getError());
        }

        if (false === $Role->add()) {
            return $this->errorResultReturn('系统错误！');
        }

        return $this->resultReturn(true);
    }
    
    /**
     * 更新角色信息
     * @return
     */
    public function updateRole($role_info) {
        $Role = $this->getD();
        if (false === ($roles = $Role->create($role_info))) {
            return $this->errorResultReturn($Role->getError());
        }

        if (false === $Role->save($roles)) {
            return $this->errorResultReturn('系统错误！');
        }

        return $this->resultReturn(true);
    }
    
    /**
     * 删除角色
     * @param type $id
     * @return type
     */
    public function deleteRoles($id) {
        if(intval($id) <= 1){
            return $this->errorResultReturn("超级管理员角色不能删除！");
        }
        $admin = D("Admin", "Service")->getByRoleId($id);
        if(isArrayAndNotEmpty($admin)){
            return $this->errorResultReturn("该角色下还有管理员，请先删除该角色下的管理员再删除角色！");
        }
        $map = array();
        $map['id'] = array("gt", 1);
        $map['id'] = array("eq", intval($id));
        if(!$this->getM()->where($map)->delete()){
            return $this->errorResultReturn("系统错误！");
        }
        return $this->resultReturn(true);
    }
    /**
     * 获取角色信息
     * @param int $id
     * @return array
     */
    public function getRoleInfo($id) {
        return $this->getM()->find($id);
    }
    /**
     * 是否存在角色
     * @param  int     $id 角色id
     * @return boolean
     */
    public function existRole($id) {
        return !is_null($this->getM()->getById($id));
    }
    /**
     * 设置状态
     * @param  int   $id     id
     * @param  int   $status 状态
     * @return mixed
     */
    public function setStatus($id, $status) {
        return $this->getM()->where("id={$id}")->save(array('status' => $status));
    }
    /**
     * 得到带有层级的role数据
     * @return array
     */
    public function getRoles($where = NULL) {
        $category = new \Org\Util\Category($this->getModelName(),
                                           array('id', 'pid', 'name'));
        return $category->getList($where);
    }

    /**
     * 得到子角色的id
     * @param  int   $id 角色id
     * @return array
     */
    public function getSonRoleIds($id) {
        $sRoles = $this->getM()->field('id')->where("pid={$id}")->select();
        $sids = array();

        if (is_null($sRoles)) {
            return $sids;
        }

        foreach ($sRoles as $sRole) {
            $sids[] = $sRole['id'];
            $sids = array_merge($sids, $this->getSonRoleIds($sRole['id']));
        }

        return $sids;
    }
    
    /**
     * 分配角色权限
     * @param  int   $roleId 角色id
     * @param  array $access 权限访问数组
     * @return array
     */
    public function assignAccess($roleId, array $access) {
        $Access = M('Access');

        $Access->startTrans();
        $Access->where("role_id={$roleId}")->delete();
        if (0 === count($access)) {
            $Access->commit();
            return $this->resultReturn(true, '清楚数据成功！');
        }

        $newAccess = array();
        foreach ($access as $item) {
            $item = explode(':', $item);
            $newAccess[] = array('role_id' => $roleId, 'node_id' => $item[0]);
        }

        // 插入新权限
        if (false === $Access->addAll($newAccess)) {
            $Access->rollback();
            return $this->errorResultReturn('分配权限失败！');
        }

        $Access->commit();
        return $this->resultReturn(true);
    }
    protected function getModelName() {
        return 'Roles';
    }
}
